package cn.lix.sc.rpc.client.impl.client;

import cn.lix.sc.rpc.impl.common.dto.EnhancedRpcRequest;
import cn.lix.sc.rpc.impl.common.dto.EnhancedRpcResponse;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 增强的Feign客户端接口，支持多种HTTP内容类型和文件处理
 *
 * @author lix
 * @date 2024
 */
public interface EnhancedRemoteInterface {

    /**
     * 增强RPC调用，支持多种内容类型
     */
    @Headers("Content-Type: application/json;charset=UTF-8")
    @RequestLine("POST /enhancedRpc/enhanced/dispatch")
    EnhancedRpcResponse enhancedDispatch(@RequestBody EnhancedRpcRequest request);

    /**
     * 文件上传RPC调用 - 使用Spring注解正确处理multipart请求
     */
    @RequestLine("POST /enhancedRpc/upload")
    @Headers("Content-Type: multipart/form-data")
    EnhancedRpcResponse uploadDispatch(
            @Param("serviceClass") String serviceClass,
            @Param("methodKey") String methodKey,
            @Param("beanName") String beanName,
            @Param("parameters") String parameters,
            @Param("file") org.springframework.web.multipart.MultipartFile file);

    /**
     * 流式数据RPC调用
     */
    @Headers("Content-Type: application/octet-stream")
    @RequestLine("POST /enhancedRpc/stream?serviceClass={serviceClass}&methodKey={methodKey}&beanName={beanName}&parameters={parameters}")
    ResponseEntity<byte[]> streamDispatch(
            @Param("serviceClass") String serviceClass,
            @Param("methodKey") String methodKey,
            @Param("beanName") String beanName,
            @Param("parameters") String parameters,
            byte[] data);

    /**
     * 纯文本RPC调用
     */
    @Headers("Content-Type: text/plain;charset=UTF-8")
    @RequestLine("POST /enhancedRpc/text?serviceClass={serviceClass}&methodKey={methodKey}&beanName={beanName}")
    EnhancedRpcResponse textDispatch(
            @Param("serviceClass") String serviceClass,
            @Param("methodKey") String methodKey,
            @Param("beanName") String beanName,
            String textData);

    /**
     * 文件下载（返回二进制数据）
     */
    @RequestLine("GET /enhancedRpc/download?fileName={fileName}")
    ResponseEntity<byte[]> downloadFile(@Param("fileName") String fileName);

    /**
     * 健康检查
     */
    @RequestLine("GET /enhancedRpc/health")
    ResponseEntity<String> healthCheck();
} 